package day05;

/*
接口：
    interface 关键字

    接口中定义的方法都是抽象方法。默认是用public abstract修饰的。
    接口中定义的属性都是静态常量。默认是用public static final修饰的。
    接口不能有构造方法。

    定义接口主要的作用：被其他类实现。

    接口、实现接口的类叫实现类。
 */
public class Demo02 {
    public static void main(String[] args) {
        Bird bird = new Bird();
        bird.eating();
        bird.running();
        bird.upFly();
        bird.downFly();

        Plane plane = new Plane();
        plane.downFly();
        plane.upFly();

        Animal animal = new Bird();
        animal.running();
        animal.eating();

        //Fly fly = new Fly(); // 接口不能实例化

        // 需要使用Fly这个接口的对象，可以用实现类来实例化
        Fly f = new Bird();
        f.upFly();
        f.downFly();

        Fly s = new Plane();
        s.upFly();
        s.downFly();

        // 文件读写，使用到了抽象类。
        // 列表、集合、Map（字典），使用到了接口和实现类。
    }
}

interface Fly {
    /*public abstract加不加效果一样*/
    public abstract void upFly();
    public abstract void downFly();
}
/*
鸟从Animal继承，同时鸟具有飞翔的功能。
Bird 是Animal的子类，是Fly接口的实现类。
 */
class Bird extends  Animal implements Fly {

    @Override
    public void eating() {
        System.out.println("Bird is eating");
    }

    @Override
    public void upFly() {
        System.out.println("鸟向上飞翔。");
    }

    @Override
    public void downFly() {
        System.out.println("鸟向下飞。");
    }
}
// 飞机也具有飞翔的功能，Plane是Fly接口的实现类。
class Plane implements  Fly {

    @Override
    public void upFly() {
        System.out.println("飞机在天空飞。");
    }

    @Override
    public void downFly() {
        System.out.println("飞机即将降落。");
    }
}